//package com.sun.config;
//
//import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
//import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
//import com.alibaba.fastjson.JSONObject;
//import com.alibaba.nacos.api.NacosFactory;
//import com.alibaba.nacos.api.config.ConfigService;
//import com.alibaba.nacos.api.config.listener.Listener;
//import com.alibaba.nacos.api.exception.NacosException;
//import com.alibaba.nacos.common.utils.CollectionUtils;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.stereotype.Component;
//import java.util.List;
//import java.util.Properties;
//import java.util.concurrent.Executor;
//
///**
// * 通过 nacos 下发动态路由配置, 监听 Nacos 中路由配置变更
// */
//@Slf4j
//@Component
//public class DynamicSentinelConfigByNacos implements ApplicationRunner {
//
//    @Autowired
//    private NacosConfig nacosConfig;
//
//    /**
//     * Nacos 配置服务
//     */
//    private ConfigService configService;
//
//
//    @Override
//    public void run(ApplicationArguments args) throws Exception {
//        log.info("sentinel config init....");
//        try {
//            // 初始化 Nacos 配置客户端
//            configService = initConfigService();
//            if (null == configService) {
//                log.error("init config service fail");
//                return;
//            }
//
//            // 通过 Nacos Config 并指定路由配置路径去获取路由配置
//            String configInfo = configService.getConfig(
//                    nacosConfig.NACOS_SENTINEL_DATA_ID,
//                    nacosConfig.NACOS_SENTINEL_GROUP_ID,
//                    nacosConfig.DEFAULT_TIMEOUT
//            );
//
//            log.info("get current sentinel config: [{}]", configInfo);
//
//            List<FlowRule> rules = JSONObject.parseArray(configInfo, FlowRule.class);
//
//            if (CollectionUtils.isNotEmpty(rules)) {
//                //加载我们的限流配置
//                FlowRuleManager.loadRules(rules);
//            }
//        } catch (Exception ex) {
//            log.error("sentinel config init has some error: [{}]", ex.getMessage(), ex);
//        }
//
//        // 设置监听器
//        dynamicRouteByNacosListener(nacosConfig.NACOS_SENTINEL_DATA_ID,
//                nacosConfig.NACOS_SENTINEL_GROUP_ID);
//    }
//
//
//    /**
//     * 初始化 Nacos Config
//     */
//    private ConfigService initConfigService() {
//
//        try {
//            Properties properties = new Properties();
//            properties.setProperty("serverAddr", nacosConfig.NACOS_SERVER_ADDR);
//            properties.setProperty("namespace", nacosConfig.NACOS_NAMESPACE);
//            return configService = NacosFactory.createConfigService(properties);
//        } catch (Exception ex) {
//            log.error("init sentinel nacos config error: [{}]", ex.getMessage(), ex);
//            return null;
//        }
//    }
//
//
//    /**
//     * <h2>监听 Nacos 下发的动态路由配置</h2>
//     */
//    private void dynamicRouteByNacosListener(String dataId, String group) {
//
//        try {
//            // 给 Nacos Config 客户端增加一个监听器
//            configService.addListener(dataId, group, new Listener() {
//
//                /**
//                 * 自己提供线程池执行操作
//                 * */
//                @Override
//                public Executor getExecutor() {
//                    return null;
//                }
//
//                /**
//                 * 监听器收到配置更新
//                 * @param configInfo Nacos 中最新的配置定义
//                 * */
//                @Override
//                public void receiveConfigInfo(String configInfo) {
//
//                    log.info("start to update sentinel config: [{}]", configInfo);
//                    List<FlowRule> rules = JSONObject.parseArray(configInfo, FlowRule.class);
//                    log.info("update sentinel: [{}]", rules.toString());
//                    if (CollectionUtils.isNotEmpty(rules)) {
//                        FlowRuleManager.loadRules(rules);
//                    }
//                }
//            });
//        } catch (NacosException ex) {
//            log.error("dynamic update sentinel config error: [{}]", ex.getMessage(), ex);
//        }
//    }
//}
